home *** CD-ROM | disk | FTP | other *** search
/ Aminet 25 / Aminet 25 (1998)(GTI - Schatztruhe)[!][Jun 1998].iso / Aminet / util / libs / ixemul_sdk.lha / include / user.h < prev    next >
C/C++ Source or Header  |  1998-01-15  |  16KB  |  472 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19.  
  20. #ifndef _USER_H
  21. #define _USER_H
  22.  
  23. #include <sys/time.h>
  24. #include <sys/resource.h>
  25. #include <sys/syslog.h>
  26. #include <sys/param.h>
  27. #include <sys/socket.h>
  28. #include <setjmp.h>
  29. #include <machine/reg.h>
  30. #include <stdio.h>
  31. #include <netdb.h>
  32. #include <pwd.h>
  33. #include <grp.h>
  34. #include <netinet/in.h>
  35. #include <arpa/inet.h>
  36. #include <arpa/nameser.h>
  37. #include <resolv.h>
  38. #include <ix.h>
  39.  
  40. struct ixnode {
  41.   struct ixnode *next, *prev;
  42. };
  43.  
  44. struct ixlist {
  45.   struct ixnode *head, *tail;
  46. };
  47.  
  48. struct utimenode {
  49.   struct ixnode node;
  50.   unsigned time;
  51. };
  52.  
  53. /* internal structure used by malloc(), kmalloc() and friends */
  54. struct malloc_data {
  55.   struct ixlist            md_list;
  56.   unsigned int        md_malloc_sbrk_used;
  57. };
  58.  
  59. /* internal structure used by the stackextend code */
  60. struct stackframe
  61. {
  62.   struct stackframe *next;    /* NULL if there is no next one */
  63.   void *savesp;            /* stored sp for next underlying stackframe */
  64.   void *upper;            /* end of this stackframe+1 */
  65. };
  66.  
  67.  
  68. /*
  69.  * One structure allocated per session.
  70.  */
  71. struct    session {
  72.     int    s_count;        /* ref cnt; pgrps in session */
  73. /*    struct    proc *s_leader;        *//* session leader */
  74.     int    pgrp;            /* controlling process group */
  75. /*    struct    vnode *s_ttyvp;        *//* vnode of controlling terminal */
  76. /*    struct    tty *s_ttyp;        *//* controlling terminal */
  77. /*    char    s_login[MAXLOGNAME];    *//* setlogin() name */
  78. };
  79.  
  80. /*
  81.  * One structure allocated per process group.
  82.  */
  83. struct    pgrp {
  84.     struct    pgrp *pg_hforw;        /* forward link in hash bucket */
  85.     struct    proc *pg_mem;        /* pointer to pgrp members */
  86.     struct    session *pg_session;    /* pointer to session */
  87.     pid_t    pg_id;            /* pgrp id */
  88.     int    pg_jobc;        /* # procs qualifying pgrp for job control */
  89. };
  90.  
  91. /* internal structure used by mmap() and friends */
  92. struct mmap_mem {
  93.     struct mmap_mem    *next;
  94.     void        *addr;
  95.     size_t        length;
  96.     int        fd;
  97.     int        offset;
  98.     int        prot;
  99.     int        flags;
  100. };
  101.  
  102. /* having it in a struct makes parameter passing easier */
  103.  
  104. struct reg_parms {
  105.   jmp_buf jb;
  106. };
  107.  
  108. struct vfork_msg {
  109.   struct Message     vm_msg;
  110.   struct Process    *vm_self;    /* for validation purposes */
  111.   struct Process     *vm_pptr;
  112.   struct reg_parms     *vm_regs;    /* parents context to restore */
  113.   int            vm_own_malloc;
  114.   int             vm_rc;        /* 0 if the child started normally, else errno */
  115.   int                   vm_plower;      /* lower bound of parents stack */
  116.   int                   vm_pupper;      /* upper bound of parents stack */
  117.   int                   vm_clower;      /* lower bound of childs stack */
  118.   int                   vm_cupper;      /* upper bound of childs stack */
  119.   int                   vm_omask;       /* parent's omask (nowhere else to store this */
  120. };
  121.  
  122. /*
  123.  * Per process structure
  124.  */
  125.  
  126. /* default size */
  127. #define A4_POINTERS 100
  128.  
  129. /* NB: a list of pointers for shared libraries is allocated *before*
  130.    the start of this struct! So the struct is actually larger, but
  131.    the advantage of this is that the number of free library slots is
  132.    easy to enlarge through a setting, without scrambling the offsets
  133.    within the 'regular' user struct. */
  134.  
  135. /* Starting with ixemul-47.0 this whole structure is PRIVATE and may
  136.    change without notice!
  137.    Use the new functions ix_get_long/ix_set_long to access certain fields
  138.    in this structure. */
  139.  
  140. struct user {
  141.     /* both a magic cookie and a way to get at the library base thru u */
  142.     struct ixemul_base    *u_ixbase;
  143.     void            *u_user;    /* freely usable user field */
  144.  
  145.     long        u_a4_pointers_size;    /* number of a4 pointers */
  146.  
  147. /* 1.3 - signal management */
  148.     sig_t        u_signal[NSIG];        /* disposition of signals */
  149.     int        u_sigmask[NSIG];    /* signals to be blocked */
  150.     sigset_t    u_sigonstack;        /* signals to take on sigstack */
  151.     sigset_t    u_sigintr;        /* signals that interrupt syscalls */
  152.     sigset_t    u_oldmask;        /* saved mask from before sigpause */
  153.     struct    sigstack u_sigstack;    /* sp & on stack state variable */
  154. #define    u_onstack    u_sigstack.ss_onstack
  155. #define    u_sigsp        u_sigstack.ss_sp
  156.     int        u_sig;            /* for core dump/debugger XXX */
  157.     int        u_code;            /* for core dump/debugger XXX */
  158.     
  159.     int            p_flag;        /* process flags, as necessary.. */
  160.     char            p_stat;
  161.     int            p_xstat;    /* exit status */
  162.     char            p_cursig;
  163.     sigset_t        p_sig;        /* signals pending to this process */
  164.     sigset_t        p_sigmask;    /* current signal mask */
  165.     sigset_t        p_sigignore;    /* signals being ignored */
  166.     sigset_t        p_sigcatch;    /* signals being caught by user */
  167.  
  168.     caddr_t         p_wchan;    /* event process is awaiting */
  169.  
  170.  
  171. /* 1.4 - descriptor management (for shared library version) */
  172.     struct file         *u_ofile[NOFILE];    /* file structures for open files */
  173.     char            u_pofile[NOFILE];    /* per-process flags of open files */
  174.     int            u_lastfile;    /* high-water mark of u_ofile */
  175. #define    UF_EXCLOSE     0x1            /* auto-close on exec */
  176.     short            u_cmask;    /* mask for file creation */
  177.  
  178. /* 1.5 - timing and statistics */
  179.     struct rusage         u_ru;        /* stats for this proc */
  180.     struct rusage         u_cru;        /* sum of stats for reaped children */
  181.     struct itimerval     u_timer[3];
  182.     struct timeval             u_start;
  183.     struct utimenode        u_time;
  184.     short            u_acflag;
  185.  
  186.     struct uprof {            /* profile arguments */
  187.         short    *pr_base;    /* buffer base */
  188.         unsigned pr_size;    /* buffer size */
  189.         unsigned pr_off;    /* pc offset */
  190.         unsigned pr_scale;    /* pc scaling */
  191.     } u_prof;
  192.     unsigned        u_prof_last_pc;    /* last function that called mcount() */
  193.  
  194. /* 1.6 - resource controls */
  195.     struct    rlimit u_rlimit[RLIM_NLIMITS];
  196.  
  197. /* amiga specific stuff */
  198.     struct malloc_data    u_md;
  199.     
  200.     struct ixnode            u_user_node;
  201.     struct Task             *u_task;
  202.     struct MsgPort        *u_sync_mp;    /* PA_SIGNAL message port */
  203.     struct timerequest     *u_time_req;
  204.     int            *u_errno;
  205.     BPTR            u_startup_cd;
  206.     
  207.     int            u_ringring;    /* used in sleep.c and usleep.c */
  208.  
  209.     char            ***u_environ;
  210.  
  211.     /* used to handle AmigaOS signals. see SIGMSG  */
  212.         u_int            u_lastrcvsig;
  213.         char            u_sleep_sig;
  214.         char            u_pipe_sig;
  215.         
  216.         /* c-startup stuff */
  217.         jmp_buf            u_jmp_buf;
  218.         char             *u_argline;
  219.         u_int            u_arglinelen;
  220.         int            u_expand_cmd_line;
  221.  
  222.     struct atexit        *u_atexit;
  223.     
  224.     char            u_getenv_buf[255];
  225.     
  226.     UBYTE            u_otask_flags;
  227.     void            (*u_olaunch)();
  228.     APTR            u_otrap_code;
  229.     APTR            u_otrap_data;
  230. #ifdef __pos__
  231.         void                    *IRQBase;       /* IRQ.resource base */
  232.     struct pOS_Interrupt    u_itimerint;    /* 1 interrupt / task */
  233. #else
  234.     struct Interrupt    u_itimerint;    /* 1 interrupt / task */
  235. #endif
  236.  
  237.     int            p_pgrp;        /* process group */
  238.     struct session        *u_session;    /* session pointer */
  239.  
  240.     char            *u_strtok_last;    /* moved with 37.8 */
  241.     
  242.     /* vfork() support */
  243.     struct ixlist        p_zombies;    /* list of death messages */
  244.     int            p_zombie_sig;    /* signal to set when a child died */
  245.     struct Process        *p_pptr;    /* parent */
  246.     struct Process        *p_opptr;    /* old parent (used in ptrace) */
  247.     struct Process        *p_cptr;    /* last recently created child */
  248.     struct Process        *p_osptr;    /* older sybling */
  249.     struct Process        *p_ysptr;    /* younger sybling */
  250.     struct vfork_msg    *p_vfork_msg;
  251.  
  252.     struct my_seg        *u_segs;    /* execve stores the SegList here */
  253.     u_long            u_start_pc;     /* start and end addresses */
  254.         u_long                  u_end_pc;       /* of the code hunk */
  255.     void            (*u_oswitch)();
  256.     
  257.     /* stdio support comes here */
  258.     char            u_tmpnam_buf[MAXPATHLEN]; /* quite large.. */
  259.     u_long            u_tmpcount;
  260. #include <glue.h>
  261.     struct glue        u_sglue;
  262.     /* the 3 `standard' FILE pointers (!) are here */
  263.     void            *u_sF[3];
  264.  
  265.     /* vfork() support #2 */
  266.     void            *u_save_sp;    /* when vfork'd, this is the `real' sp */
  267.     jmp_buf            u_vfork_frame;    /* for the parent in vfork () */
  268.     u_int            u_mini_stack[1000]; /* 4K stack while in vfork () */
  269.  
  270.     /* stack watcher. When usp < u_red_zone && ix.ix_watch_stack -> SIGSEGV */
  271.     void            *u_red_zone;
  272.  
  273.     /* base relative support. This even works for pure programs ! */
  274.     u_int            u_a4;
  275.     
  276.     /* currently there's just 1, meaning don't trace me */
  277.     u_int            u_trace_flags;
  278.     
  279.     /* this is for getmntinfo() */
  280.     struct statfs        *u_mntbuf;
  281.     int            u_mntsize;
  282.     long            u_bufsize;
  283.     
  284.     /* this is for SIGWINCH support. */
  285.     struct IOStdReq        *u_idev_req;
  286.     struct Window        *u_window;    /* the watched window */
  287. #ifdef __pos__
  288.     struct pOS_Interrupt    u_idev_int;
  289. #else
  290.     struct Interrupt    u_idev_int;
  291. #endif
  292.  
  293.     /* for `ps' (or dump as it's called for now.. ) */
  294.     char            *p_wmesg;
  295.     
  296.     /* new support for `real' process groups, control ttys etc.. */
  297.     struct user        *p_pgrpnxt;
  298.     struct pgrp        *p_pgrpptr;
  299.     struct Process        *p_exec_proc;    /* to get back to struct Process */
  300.     
  301.     /* to be able to switch memory lists on the fly, as required when vfork'd
  302.        processes are supposed to allocate memory from their parents pool until
  303.        they detach. */
  304.     struct malloc_data    *u_mdp;
  305.     
  306.     /* data needed for network support */
  307.     struct Library        *u_ixnetbase;
  308.     void            *u_ixnet;
  309.     int                     *u_h_errno;
  310.  
  311.     /* ptrace() and kern_sig.c:stopped_process_handler() interface.  */
  312.     struct reg              *u_regs;
  313.     struct fpreg            *u_fpregs;
  314.     int            u_mask_state;
  315.  
  316.     /* strftime() globals */
  317.     size_t            u_gsize;
  318.     char            *u_pt;
  319.     
  320.     /* putenv() global */
  321.     int            u_env_alloced;
  322.     
  323.     /* rand() global */
  324.     u_long            u_rand_next;
  325.     
  326.     /* stuff for stackextend */
  327.     void            *u_tc_splower;    /* original entries of task structure */
  328.     void            *u_tc_spupper;    /* to restore them at exit */
  329.     void            *u_org_lower;    /* original stackborders */
  330.     void            *u_org_upper;
  331.     void            **u_stk_limit;    /* pointer to limit variable */
  332.     unsigned long        u_stk_argbt;    /* Maximum size of arguments */
  333.     struct stackframe    *u_stk_used;    /* used stackframes */
  334.     struct stackframe    *u_stk_spare;    /* spare stackframes */
  335.     unsigned long        u_stk_current;    /* current stack size */
  336.     unsigned long        u_stk_max;    /* maximum stack size so far */
  337.  
  338.     char u_root_directory[MAXPATHLEN];    /* for chroot() */
  339.     short            u_is_root;    /* current directory is root */
  340.  
  341.     /* stuff for muFS support */
  342.     struct muUserInfo       *u_UserInfo;    /* private muUserInfo to use */
  343.     struct muGroupInfo      *u_GroupInfo;   /* private muGroupInfo to use */
  344.     struct muUserInfo       *u_fileUserInfo;    /* private muUserInfo for database ops */
  345.     struct muGroupInfo      *u_fileGroupInfo;   /* private muGroupInfo for database ops */
  346.     BOOL                    u_groupfileopen;    /* dummy for emulation */
  347.     BOOL                    u_passwdfileopen;   /* dummy for emulation */
  348.     struct passwd           u_passwd;       /* static buffer to hold the data */
  349.     struct group            u_group;        /* ditto */
  350.  
  351.     FILE            *u_grp_fp;    /* File pointer to the groups file */
  352.     int            u_grp_stayopen;    /* TRUE if group file should stay open */
  353.     char            **u_members;    /* array of group members */
  354.     char            *u_grp_line;    /* buffer for reading a line from the group file */
  355.  
  356.     /* Support for ixnet functions */
  357.     FILE            *u_serv_fp;    /* File pointer to services file */
  358.     char            *u_serv_line;    /* buffer for reading a line from the services file */
  359.     struct servent        u_serv;
  360.     char            **u_serv_aliases;
  361.     int            u_serv_stayopen;
  362.     
  363.     FILE            *u_proto_fp;    /* File pointer to protocol file */
  364.     char            *u_proto_line;
  365.     struct protoent        u_proto;
  366.     char            **u_proto_aliases;
  367.     int            u_proto_stayopen;
  368.     
  369.     int                     u_logname_valid;
  370.     char                    u_logname[MAXLOGNAME + 1];
  371.     char                    u_logname_buf[MAXLOGNAME + 1];
  372.     
  373.     char            u_ntoa_buf[18];    /* used by inet_ntoa */
  374.     
  375.     /* resolv state structure */
  376.     struct __res_state    *u_res;
  377.     int            *u_res_socket;
  378.     
  379.     /* logfile handling */
  380.     int            u_LogFile;    /* fd for log */
  381.     int            u_LogStat;    /* status bits, set by openlog() */
  382.     char            *u_LogTag;    /* string to tag the entry with */
  383.     int            u_LogFacility;    /* default facility code */
  384.     int            u_LogMask;    /* mask of priorities to be logged */
  385.     
  386.     int            u_setuid;    /* used for setuid() - have to remember
  387.                          * to log out */
  388.     /* mmap handling */
  389.     struct mmap_mem        *u_mmap;
  390.  
  391.     struct MsgPort        *u_select_mp;    /* PA_SIGNAL message port */
  392.  
  393.         /* strtod support */
  394.         void                    *u_freelist[16];
  395.         void                    *u_p5s;
  396.         void                    *u_result;
  397.         int                     u_result_k;
  398.         
  399.         /* popen support */
  400.         pid_t                   *u_popen_pids;
  401.  
  402.         /* uid / gid support */
  403.  
  404.     FILE            *u_pwd_fp;    /* File pointer to the passwd file */
  405.     int            u_pwd_stayopen;    /* TRUE if passwd file should stay open */
  406.     char            *u_pwd_line;    /* buffer for reading a line from the passwd file */
  407.  
  408.     char                    u_crypt_buf[21];
  409.  
  410.     uid_t                   u_nextuid;
  411.         uid_t                   u_nextgid;
  412.  
  413.     uid_t                   u_ruid;
  414.         uid_t                   u_euid;
  415.         gid_t                   u_rgid;
  416.         gid_t                   u_egid;
  417.         int                     u_ngroups;
  418.     int                     u_grouplist[NGROUPS_MAX]; /* for init/get/setgroups() */
  419.     
  420.     /* shm support */
  421.     int            u_shmsize;
  422.     int            u_shmused;
  423.     void            **u_shmarray;
  424.     
  425.     /* ix_segment support */
  426.     ix_segment              u_segment_info;
  427. #ifdef __pos__
  428.         struct pOS_Segment      *u_segment_ptr;
  429.         struct pOS_SegmentLst   *u_segment_list;
  430. #else
  431.         short                   u_segment_no;   /* segment number (0-2) */
  432.         long                    u_segment_ptr;
  433. #endif
  434. };
  435.  
  436. /* flag codes */
  437. #define    SLOAD    0x0000001    /* in core */
  438. #define    SSYS    0x0000002    /* swapper or pager process */
  439. #define    SLOCK    0x0000004    /* process being swapped out */
  440. #define    SSWAP    0x0000008    /* save area flag */
  441. #define    STRC    0x0000010    /* process is being traced */
  442. #define    SWTED    0x0000020    /* parent has been told that this process stopped */
  443. #define    SULOCK    0x0000040    /* user settable lock in core */
  444. #define    SNOCLDSTOP    0x0000080    /* tc_Launch has to take a signal next time */
  445. #define    SFREEA4    0x0000100    /* we allocated memory for a4, free it */
  446. #define    SOMASK    0x0000200    /* restore old mask after taking signal */
  447. #define    SWEXIT    0x0000400    /* working on exiting */
  448. #define    SPHYSIO    0x0000800    /* doing physical i/o (bio.c) */
  449. #define    SVFORK    0x0001000    /* process resulted from vfork() */
  450. #define    SVFDONE    0x0002000    /* another vfork flag */
  451. #define    SNOVM    0x0004000    /* no vm, parent in a vfork() */
  452. #define    SPAGI    0x0008000    /* init data space on demand, from inode */
  453. #define    SSEQL    0x0010000    /* user warned of sequential vm behavior */
  454. #define    SUANOM    0x0020000    /* user warned of random vm behavior */
  455. #define    STIMO    0x0040000    /* timing out during sleep */
  456. #define    SORPHAN    0x0080000    /* process is orphaned (can't be ^Z'ed) */
  457. #define    STRACNG    0x0100000    /* process is tracing another process */
  458. #define    SOWEUPC    0x0200000    /* owe process an addupc() call at next ast */
  459. #define    SSEL    0x0400000    /* selecting; wakeup/waiting danger */
  460. #define    SLOGIN    0x0800000    /* a login process (legit child of init) */
  461. #define SUSAGE  0x1000000    /* we already reported the stack usage */
  462.  
  463. /* stat codes */
  464. #define    SSLEEP    1        /* awaiting an event */
  465. #define    SWAIT    2        /* (abandoned state) */
  466. #define    SRUN    3        /* running */
  467. #define    SIDL    4        /* intermediate state in process creation */
  468. #define    SZOMB    5        /* has exited, waiting for parent to pick up status */
  469. #define    SSTOP    6        /* stopped */
  470.  
  471. #endif /* _USER_H */
  472.